/*
  明确函数的双重用途
    ES6提供了一个特殊的api（new.target），可以使用该api在函数内部，判断该函数是否使用了new来调用
    该表达式，得到的是：如果没有使用new来调用，则返回undefined，如果使用new调用函数，则得到的是new
    关键字后面的函数本是
*/

function Person(firstname, lastname) {
  // es6之间判断该函数是否通过new调用（有缺陷）
  /* if (!(this instanceof Person)) {
    throw new Error("该函数没有使用new来调用");
  } */

  // es6
  if (typeof new.target === "undefined") {
    throw new Error("该函数没有使用new来调用");
  }

  this.firstname = firstname;
  this.lastname = lastname;
  this.fullname = `${firstname} ${lastname}`;
}

const p1 = new Person("张", "三");
console.log(p1);

/* const p2 = Person("张", "三");
console.log(p2); */

const p3 = Person.call(p1, "张", "三");
console.log(p3);
